#ifndef CHAINE_CHAINE_ENTREE_H
#define CHAINE_CHAINE_ENTREE_H

	#include "chaineEntree.h"

	/* chaine avec suppression, modification et recherche de noeuds quelqonque avec ajout en tete*/
	typedef struct chaineChaineEntreeNode {char * clef; pChaineEntreeNode cible; struct chaineChaineEntreeNode * next;} * pChaineChaineEntreeNode;

	//renvoie 1 si la chaine est égale à NULL, 0 sinon
	int chaineChaineEntreeNodeEstNull (pChaineChaineEntreeNode node);
	//renvoie le prochain maillon de la chaine
	pChaineChaineEntreeNode nextChaineChaineEntreeNode(pChaineChaineEntreeNode node);
	//renvoie la clef du maillon courant de la chaine
	char * clefChaineChaineEntreeNode(pChaineChaineEntreeNode node);
	//renvoie la valeur du maillon courant de la chaine
	pChaineEntreeNode cibleChaineChaineEntreeNode(pChaineChaineEntreeNode node);
	//renvoie un nouveau maillon
	pChaineChaineEntreeNode nouveauChaineChaineEntreeNode (char * clef, pChaineEntreeNode cible);
	//renvoie 1 si la clef passée en paramètre est identique à celle du maillon courant, 0 sinon
	int cmpChaineChaineEntreeNodeClef(char * clef, pChaineChaineEntreeNode node);
	//renvoie la valeur du maillon dont la clef est identique à celle passée en paramètre. Renvoie Null si un tel maillon n'est pas trouvé.
	pChaineEntreeNode rechercheCibleChaineChaineEntreeNode(char * clef, pChaineChaineEntreeNode chaine);
	//renvoie 1 si un maillon de la chaine à une clef identique à celle passée en paramètre. 0 sinon.
	int existeChaineChaineEntreeNode(char *clef, pChaineChaineEntreeNode chaine);
	//renvoie 1 si un maillon de la chaine à une clef identique à celle passée en paramètre et que la cible n'est pas null. 0 sinon.
	int existeChaineChaineEntreeNodeCibleNonNull(char *clef, pChaineChaineEntreeNode chaine);
	//renvoie la chaine après ajoue en tete d'un nouveau noeud contenant les clef/valeur en paramètre. suppose que la clef n'existe pas dans la chaine, meme avec cible null
	pChaineChaineEntreeNode ajoutChaineChaineEntreeNodeDebut(char * clef, pChaineEntreeNode cible, pChaineChaineEntreeNode chaine);
	//renvoie la chaine après suppression du maillon dont la clef est identique à celle en paramètre. Le maillon doit exister.
	pChaineChaineEntreeNode suppressionChaineChaineEntreeNode (char * clef, pChaineChaineEntreeNode chaine);
	//modifie la valeur du maillon dont la clef est identique à celle en paramètre. (-1 si le maillon n'est pas trouvé, 0 sinon)
	int modifierCibleChaineChaineEntreeNode(char * clef, pChaineEntreeNode cible, pChaineChaineEntreeNode chaine);
	//affiche la chaine
	void afficheChaineChaineEntree (pChaineChaineEntreeNode chaine);
	//renvoie si la ligne est vide ou avec que des fantomes
	int estVideChaineChaineEntree (pChaineChaineEntreeNode chaine);

#endif
